#include <iostream>
#include <pthread.h>
#include <functional>
#include <string>
#include <unistd.h>

typedef void* (*func_t)(void*); // pthread_creat() C接口不接受包装器functional

// 当线程处理函数运行时需要便捷得知当前线程的信息，
// 因此我们将传入一个结构体。
class ThreadDate
{
public:
    void* args;         // 线程任务函数参数
    std::string _name;  // 线程名字
    pthread_t _id;      // 线程ID
    // void* _TP;       // 主进程对象
};

class Thread
{
public:
    Thread(int pid, func_t calltalk, void* args):func_(calltalk)
    {
        char name[64]; 
        snprintf(name, sizeof name, "Thread - %d ", pid);  // 将线程编号导入到名字中
        
        trda_._name = name; 
        trda_._id = pid;
        trda_.args = args;
    }
    
    void start()
    {
        pthread_create(&trda_._id, nullptr, func_ , (void*)&trda_);
    }

    void join()
    {
        pthread_join(trda_._id ,nullptr);
    }

    const std::string& name()
    {
       return trda_._name;
    }

private:
    func_t func_;       // 处理函数
    ThreadDate trda_; // 给任务提供的线程等其他信息
};



